人工神经网络案例

山东理工大学 数学学院 周世祥 shixiangbupt@qq.com
人们已经知道,生物对信息的处理,主要依靠大脑内部的神经网络进行,神经网络的基本单元是神经细胞,也叫神经元,如图
生物神经网络的工作机制:
整个网络接收的信息由各个神经元一起接收,即每个神经元从外界接收一部分信息,然后各自进行处理,将结果输出;
所有神经元的输出结果组合起来,构成整个神经网络对信息处理的最终结果 。
人工神经网络的结构
了解到生物神经网络的优点,人们模仿它们的结构,构造了人工神经网络
整体结构:一般为层状结构,每层由若干个神经元组成,层与层之间由联结权值相连
输入层:左边,接受外界信息
隐含层:中间,对信息进行处理
输出层:右边,把处理结果输出
人工神经元
人工神经网络是由若干个人工神经元组成的,就是上图中的小圆
人工神经元是人工神经网络的基本结构单元,也是基本功能单元
典型的人工神经元的结构如图所示
从上图可以看到,人工神经元的构成:
信息的输入、求和单元、联结权值、激活函数、输出等
人工神经网络的特点
由于结构和工作机制与生物神经网络相似,所以,人工神经网络也具有类似的特点
1. 具有自学习能力:人工神经网络可以通过训练进行自学习,优化自己的结构,掌握接收的信息包含的一些规律
2. 高度的非线性全局作用:
人工神经网络中的神经元互相联结,每个神经元都会接受其它神经元输入的信息,同时也向其它神经元输出信息
整个神经网络接收的信息分布在所有神经元中
整个网络对信息的处理是所有神经元共同处理的结果
处理结果也分布在每个神经元中
所以,整个网络的性能取决于所有神经元的性能,表现为一种高度的非线性全局作用
3. 良好的容错性:
由于人工神经网络的结构和功能具有整体性特征,所以,整个网络对信息的处理具有较好的容错性:即使有部分神经元出现了错误,但对整体的处理结果影响比较有限
4. 高度的并行处理能力
人工神经网络里的神经元以并联方式组成,从而对信息有很强的并行处理能力
优势:处理图像或声音等信息时,有很高的处理速度、准确率、记忆功能和联想功能等
研究者已经证明:人工神经网络是一个通用的函数逼近模型,通过选择合适的激活函数及适当的结构,包括层数和每层的神经元数量,理论上可以方便、快速地以任意精度逼近任何复杂的函数
所以,人工神经网络是一个万能的经验公式,具有很强的逼近能力,特别擅长处理输入与输出元素间存在复杂的非线性关系的问题,尤其是多元、高次问题
人工神经网络就适合进行这类工作,尤其对其内在规律不了解因而不能建立明确的物理和数学模型者
人工神经网络不仅能研究输入因素与输出因素间的定性关系,而且能方便地研究它们间的定量关系,具有精度高、成本低等优点
人工神经网络有多个类型,每种类型的特点、性能和应用领域都不同。人们一般使用反向传播(Back-Propogation,简称BP网络)或径向基函数(Radial Basis Function,简称RBF)模型解决预测问题
设计网络的结构
1)层数。人工神经网络模型最少需要三层:一个输入层、一个隐含层和一个输出层
隐含层的数量可以增加。一般来说,隐含层的层数越多,预测精度越高,但是需要的训练时间会越长。对一般的问题,用三层网络就可以
输入层神经元的数量是由问题的影响因素决定的,比如,要根据材料的化学成分预测它的强度,有几种化学成分,输入层就设计几个神经元
输出层的神经元的数量是由要预测的性能数量决定的,如果只预测一个性能,比如强度,那输出层就只设计一个神经元,如果预测三个性能,比如强度、硬度、韧性,输出层就设计三个神经元
训练样本
训练人工神经网络,需要搜集一定数量的训练样本。在多数情况下,训练样本的数量越多,人工神经网络的训练就越充分,预测精度就越高
预测
人工神经网络被训练好并经过验证后,就可以进行预测、解决实际问题了
在预测的基础上,还可以进行更深入的工作,比如,对各个因素的影响进行定性和定量分析,包括单因素分析、双因素分析等
径向基RBF神经网络
1985年,Powell提出了多变量插值的径向基函数(Radial Basis Function——RBF)方法。1988年,BroomheadLowe首先将RBF应用于神经网络设计,从而构成了RBF神经网络。它是一种局部逼近的神经网络。众所周知,BP网络用于函数逼近时,权值的调节采用的是负梯度下降法,这种调节权值的方法有它的局限性,即存在着收敛速度慢和局部极小等缺点。而RBF神经网络无论在逼近能力、分类能力和学习速度等方面均优于BP网络。径向基函数网络比BP网络需要更多的神经元,但是它能够按时间片来训练网络。
RBF网络的结构与多层前向网络类似,它是具有单隐层的一种两层前向网络。输入层由信号源节点组成。隐含层的单元数视所描述问题的需要而定。输出层对输入的作用作出响应。从输入空间到隐含层空间的变换是非线性的,而从隐含层空间到输出层空间变换是线性的。隐单元的变换函数是RBF,它是一种局部分布的对中心点径向对称衰减的非负非线性函数。
构成RBF网络的基本思想是:用RBF作为隐单元的构成隐含层空间,这样就可将输入矢量直接(即不通过权连接)映射到隐空间。当RBF的中心点确定以后,这种映射关系也就确定了。
隐层节点中的作用函数(核函数)对输入信号将在局部产生响应,也就是说,当输入信号靠近该函数的中央范围时,隐层节点将产生较大的输出。由此可看出这种网络具有局部逼近能力,所以径向基函数网络也称为局部感知场网络。
激活函数都是径向对称的,虽然有各种各样的激活函数,但最常用的是高斯激活函数,如RBF网络隐层第i个节点的输出可由下式表示:
其中,是第i个隐节点的输出,是第i个隐节点的标准化常数,q是隐层节点数, 是输入样本, 是第i个隐节点高斯函数的中心向量,此向量是一个与输入样本x的维数相同的列向量,即 。由上式可知,节点的输出范围在01之间,且输入样本愈靠近节点的中心,输出值愈大。当 时,
RBF网络的学习过程分为两个阶段。
第一阶段,是无教师学习。是根据所有的输入样本决定隐层各节点的高斯核函数的中心向量 和标准化常数
第二阶段,有教师学习。在决定好隐层的参数后,根据样本,利用最小二乘原则,求出隐含层和输出层的权值。有时在完成第二阶段的学习后,再根据样本信号,同时校正隐层和输出层的参数,以进一步提高网络的精度。
下面是一个简单的RBF型神经网络模型的MATLAB编程实例:
x = [1 2 3 4 5];
t = [2.2 3.9 6.1 7.9 9.8];
plot(x,t,'o-')
hold on
net = newgrnn(x,t) % RBF型神经网络的设计
net = Neural Network name: 'Generalized Regression Neural Network' userdata: (your custom info) dimensions: numInputs: 1 numLayers: 2 numOutputs: 1 numInputDelays: 0 numLayerDelays: 0 numFeedbackDelays: 0 numWeightElements: 15 sampleTime: 1 connections: biasConnect: [1; 0] inputConnect: [1; 0] layerConnect: [0 0; 1 0] outputConnect: [0 1] subobjects: input: Equivalent to inputs{1} output: Equivalent to outputs{2} inputs: {1x1 cell array of 1 input} layers: {2x1 cell array of 2 layers} outputs: {1x2 cell array of 1 output} biases: {2x1 cell array of 1 bias} inputWeights: {2x1 cell array of 1 weight} layerWeights: {2x2 cell array of 1 weight} functions: adaptFcn: (none) adaptParam: (none) derivFcn: 'defaultderiv' divideFcn: (none) divideParam: (none) divideMode: 'sample' initFcn: 'initlay' performFcn: 'mse' performParam: .regularization, .normalization plotFcns: {} plotParams: {1x0 cell array of 0 params} trainFcn: (none) trainParam: (none) weight and bias values: IW: {2x1 cell} containing 1 input weight matrix LW: {2x2 cell} containing 1 layer weight matrix b: {2x1 cell} containing 1 bias vector methods: adapt: Learn while in continuous use configure: Configure inputs & outputs gensim: Generate Simulink model init: Initialize weights & biases perform: Calculate performance sim: Evaluate network outputs given inputs train: Train network with examples view: View diagram unconfigure: Unconfigure inputs & outputs
y=sim(net,x)
y = 1×5
2.906309434403926 4.147776726584675 6.000000000000000 7.797729422894987 9.037511338255520
plot(x,y,'*-')
可见预测值与实际值相差很小。
TA15钛合金的性能与热加工工艺参数间存在重要的联系,然而,它们间的关系很复杂,用回归分析等方法得到的精度较差,所以决定采用人工神经网络来进行
人工神经网络(ANN)模型类型的选择
在传统上,解决预测问题时,人们使用的人工神经网络模型主要是反向传播(BP)型神经网络,但是,这种模型存在一些缺点:收敛速度慢、需要的训练时间长、容易陷入局部极小、预测精度不高等 .
RBF网络用于非线性系统辨识与控制,虽具有唯一最佳逼近的特性,以及无局部极小的优点,但隐节点的中心难求,这是该网络难以广泛应用的原因。
预测钛合金性能的RBF型人工神经网络的MATLAB语句为:
net=newgrnn(Pi,Ti,spread);
其中,Pi指钛合金的加工工艺参数,Ti是钛合金的抗拉强度。SpreadRBF型人工神经网络的一个结构参数,可以通过调整它的大小,来调整网络的预测性能
钛合金的热加工工艺参数包括四个:加热温度、应变量、应变速率、冷却方式,性能只考虑抗拉强度
所以,我们设计的RBF型神经网络模型如图所示,它包括三层:输入层、输出层及隐含层
输入层有4个节点,分别代表钛合金的4个热加工工艺参数;
隐含层的节点数在训练过程中进行调整,得到最佳值;
输出层包含1个节点,表示抗拉强度
径向基函数人工神经网络模型也有多种,我们使用其中一种,叫广义回归神经网络
MATLAB中,设计广义回归神经网络模型的指令:newgrnn
人工神经网络训练样本和检验样本的搜集
ANN模型的训练
1)原始数据的预处理
在表中的热加工工艺参数中,冷却方法有两种:空冷和水冷。本文中设计的神经网络模型是用软件实现的,计算机只能识别数字信号,所以必须用数字来表征这两种冷却方法,本文分别用12代表空冷和水冷
a= [ 960 0.916 0.0070 1 1000
960 0.693 0.0060 1 990
960 0.511 0.0057 1 987
960 0.916 0.0070 2 983
925 0.916 0.0070 1 984
925 0.693 0.0060 1 996
925 0.511 0.0057 1 973
925 0.916 0.0070 2 973
850 0.916 0.0070 1 990
850 0.916 0.0070 2 978
850 0.916 0.0046 1 1002
750 0.350 0.0157 1 935
850 0.350 0.0024 1 960
850 0.350 0.0018 1 962
850 0.350 0.0024 2 933
900 0.350 0.0052 1 924
900 0.350 0.0018 1 947
900 0.350 0.0024 2 908
925 0.350 0.0052 1 943
925 0.350 0.0024 1 928
925 0.350 0.0024 2 915
960 0.350 0.0052 1 935
960 0.350 0.0024 1 976
960 0.350 0.0018 1 943 ];
C=a(:,1)';
D=a(:,2)';
E=a(:,3)';
F=a(:,4)';
T=a(:,5)';
C1=(C-min(C'))/(max(C')-min(C'))-0.5;
D1=(D-min(D'))/(max(D')-min(D'))-0.5;
E1=(E-min(E'))/(max(E')-min(E'))-0.5;
F1=(F-min(F'))/(max(F')-min(F'))-0.5;
P=[C1
D1
E1
F1 ]'
P = 24×4
0.500000000000000 0.500000000000000 -0.125899280575540 -0.500000000000000 0.500000000000000 0.106007067137809 -0.197841726618705 -0.500000000000000 0.500000000000000 -0.215547703180212 -0.219424460431655 -0.500000000000000 0.500000000000000 0.500000000000000 -0.125899280575540 0.500000000000000 0.333333333333333 0.500000000000000 -0.125899280575540 -0.500000000000000 0.333333333333333 0.106007067137809 -0.197841726618705 -0.500000000000000 0.333333333333333 -0.215547703180212 -0.219424460431655 -0.500000000000000 0.333333333333333 0.500000000000000 -0.125899280575540 0.500000000000000 -0.023809523809524 0.500000000000000 -0.125899280575540 -0.500000000000000 -0.023809523809524 0.500000000000000 -0.125899280575540 0.500000000000000
% 进行归一化处理:
xN表示归一化处理后的结果,x表示初始数据,xmaxxmin分别.表示各个参数的最大值和最小值
3)神经网络模型的训练
研究者使用较多的训练方法是“二分法”,即将搜集的所有样本分为两部分,第一部分是训练样本,约占样本总量的80%,第二部分是预测样本,约占样本总量的20%.
另一种训练方法:“留一法”(Leave-One-Out method)
训练步骤:
第一轮,将第一个样本取出来,用剩余的样本训练神经网络,然后用取出的那个样本测试网络的性能;
第二轮,将第一个样本放回数据库,取出第二个样本,再用其余样本训练神经网络,用取出的那个样本测试网络的性能,……
这样,用所有的样本均测试一遍网络的性能,对神经网络的结构进行优化
训练人工神经网络的MATLAB程序为:
a= [ 960 0.916 0.0070 1 1000
960 0.693 0.0060 1 990
960 0.511 0.0057 1 987
960 0.916 0.0070 2 983
925 0.916 0.0070 1 984
925 0.693 0.0060 1 996
925 0.511 0.0057 1 973
925 0.916 0.0070 2 973
850 0.916 0.0070 1 990
850 0.916 0.0070 2 978
850 0.916 0.0046 1 1002
750 0.350 0.0157 1 935
850 0.350 0.0024 1 960
850 0.350 0.0018 1 962
850 0.350 0.0024 2 933
900 0.350 0.0052 1 924
900 0.350 0.0018 1 947
900 0.350 0.0024 2 908
925 0.350 0.0052 1 943
925 0.350 0.0024 1 928
925 0.350 0.0024 2 915
960 0.350 0.0052 1 935
960 0.350 0.0024 1 976
960 0.350 0.0018 1 943 ];
C=a(:,1)';
D=a(:,2)';
E=a(:,3)';
F=a(:,4)';
T=a(:,5)';
C1=(C-min(C'))/(max(C')-min(C'))-0.5;
D1=(D-min(D'))/(max(D')-min(D'))-0.5;
E1=(E-min(E'))/(max(E')-min(E'))-0.5;
F1=(F-min(F'))/(max(F')-min(F'))-0.5;
P=[C1
D1
E1
F1 ];
T ;
n=size(P,2);
spread=0.05;
for i=1:n
Pi=[P(:,1:(i-1)) P(:,(i+1):n) ];
Ti=[T(:,1:(i-1)) T(:,(i+1):n) ] ;
net=newgrnn(Pi,Ti,spread);
PPi= P(:,[i]);
Y0005(i)=sim(net,PPi );
end
T;
Y0005;
Tlie=T(:);
Y0005=Y0005(:);
errorarray=[Tlie Y0005 ]
errorarray = 24×2
103 ×
1.000000000000000 0.984000000000000 0.990000000000000 0.995999999993790 0.987000000000000 0.972999989394710 0.983000000000000 0.973000000000000 0.984000000000000 0.999999999999990 0.996000000000000 0.989999999988282 0.973000000000000 0.986999987364787 0.973000000000000 0.982999999999995 0.990000000000000 1.001999999999969 0.978000000000000 0.973000000000000
X=errorarray(:,1) ;
Y1=errorarray(:,2) ;
plot(X,Y1,'ko')
hold on
x0=[900 1100];
y1=[900 1100];
Q1=polyfit( x0,y1,3);
警告: 多项式不是唯一的;次数 >= 数据点的数目。
f1=polyval(Q1, x0);
plot( x0,y1,x0,f1,'k-','LineWidth',0.25);
hold on
axis('square');
axis('equal');
axis([900,1100,900,1100]);
xlabel('抗拉强度 (MPa)','Fontsize',15);
ylabel('预测抗拉强度 (MPa)','Fontsize',15);
% 第一列数据表示实际测试值,第二列表示人工神经网络模型的计算值。
散点图:实际测试值和人工神经网络模型的计算值分别做为横坐标和纵坐标
从图中可以看到,散点图中的点基本上都比较接近45°对角线,说明神经网络对样本的计算精度较高,ANN模型的训练效果较好
评价误差的定量指标
评价误差的定量指标
式中: VCalc-计算值;VMeas-测试值;N-样本数量
可以证明,均方误差和相对均方误差接近0、拟合分值接近2时,表示神经网络模型的计算误差小,训练效果好
MATLAB程序为:
errorarray0003 = [ 1.0000 0.9840
0.9900 0.9960
0.9870 0.9730
0.9830 0.9730
0.9840 1.0000
0.9960 0.9900
0.9730 0.9870
0.9730 0.9830
0.9900 1.0020
0.9780 0.9730
1.0020 0.9900
0.9350 0.9240
0.9600 0.9620
0.9620 0.9600
0.9330 0.9080
0.9240 0.9430
0.9470 0.9280
0.9080 0.9150
0.9430 0.9242
0.9280 0.9480
0.9150 0.9080
0.9350 0.9439
0.9760 0.9430
0.9430 0.9760 ];
n=size(errorarray0003,1);
T= errorarray0003(:,1) ;
Y1=errorarray0003(:,2) ;
mse1=sqrt(sum((Y1-T).^2)/n)
mse1 =
0.015908134711524
meanrelaerror1=sqrt( sum(((Y1-T)./T).^2)/n)
meanrelaerror1 =
0.016653342319469
fitness21= 1+(sum((Y1-sum(Y1)/n).*(T-sum(T)/n)))/sqrt((sum(Y1.^2)-n*((sum(Y1)/n)^2))*(sum(T.^2)-n*((sum(T)/n)^2)))
fitness21 =
1.850487585690624
从数据可以看到,ANN模型的误差比较小,受到了较好的训练。
ANN模型预测钛合金的抗拉强度
ANN模型经过训练后,就可以用来预测钛合金的抗拉强度了
MATLAB程序为:
clear all
clc
a= [ 960 0.916 0.0070 1 1000
960 0.693 0.0060 1 990
960 0.511 0.0057 1 987
960 0.916 0.0070 2 983
925 0.916 0.0070 1 984
925 0.693 0.0060 1 996
925 0.511 0.0057 1 973
925 0.916 0.0070 2 973
850 0.916 0.0070 1 990
850 0.916 0.0070 2 978
850 0.916 0.0046 1 1002
750 0.350 0.0157 1 935
850 0.350 0.0024 1 960
850 0.350 0.0018 1 962
850 0.350 0.0024 2 933
900 0.350 0.0052 1 924
900 0.350 0.0018 1 947
900 0.350 0.0024 2 908
925 0.350 0.0052 1 943
925 0.350 0.0024 1 928
925 0.350 0.0024 2 915
960 0.350 0.0052 1 935
960 0.350 0.0024 1 976
960 0.350 0.0018 1 943 ];
C=a(:,1)';
D=a(:,2)';
E=a(:,3)';
F=a(:,4)';
T=a(:,5)';
C1=(C-min(C'))/(max(C')-min(C'))-0.5;
D1=(D-min(D'))/(max(D')-min(D'))-0.5;
E1=(E-min(E'))/(max(E')-min(E'))-0.5;
F1=(F-min(F'))/(max(F')-min(F'))-0.5;
P=[C1
D1
E1
F1 ];
T ;
spread=0.05;
net=newgrnn(P,T,spread);
a1=[ 960 0.916 0.0046 1 1035
925 0.916 0.0046 1 1020
850 0.350 0.0052 1 962
900 0.350 0.0024 1 948
925 0.350 0.0018 1 921
960 0.350 0.0024 2 910 ];
C0=a1(:,1)';
D0=a1(:,2)';
E0=a1(:,3)';
F0=a1(:,4)';
C10=(C0-min(C'))/(max(C')-min(C'))-0.5;
D10=(D0-min(D'))/(max(D')-min(D'))-0.5;
E10=(E0-min(E'))/(max(E')-min(E'))-0.5;
F10=(F0-min(F'))/(max(F')-min(F'))-0.5;
P0=[C10
D10
E10
F10 ];
hv=sim(net,P0) ;
hv1=hv';
t00=a1(:,5);
b=[hv1 t00]
b = 6×2
103 ×
0.999992769872459 1.035000000000000 0.984007230127572 1.020000000000000 0.959602785416576 0.962000000000000 0.946393473758899 0.948000000000000 0.928637325931273 0.921000000000000 0.914999997707419 0.910000000000000
plot(hv1,t00,'bo')
hold on
x0=[900 1100];
y1=[900 1100];
Q1=polyfit( x0,y1,1);
f1=polyval(Q1, x0);
plot( x0,y1, x0,f1,'g-','LineWidth',0.25);
hold on
axis('square');
axis('equal');
axis([900,1100,900,1100]);
xlabel('Measured tensile strength (MPa)','Fontsize',15);
ylabel('Predicted tensile strength (MPa)','Fontsize',15);

MATLAB神经网络工具箱函数

随着MATLAB软件的版本提高,其对应的神经网络工具箱的内容越来越丰富,它包括了很多现有的神经网络的新成果,涉及的网络模型有,感知机网络、线性神经网络、BP神经网络、径向基神经网络、自组织神经网络、学习向量量化神经网络、Elman神经网络、Hopfield神经网络、自适应滤波和控制系统网络等。
BP网络主要功能有
clear all
echo on
%采用动量梯度下降算法训练BP网络
% newff生成一个新的前向神经网络
% train对 BP 神经网络进行训练
% Ssim对 BP 神经网络进行仿真
% 定义训练样本
P=[-1, -2, 3, 1; -1, 1, 5, -3]; % P 为输入矢量
T=[-1, -1, 1, 1]; % T 为目标矢量
% 创建一个新的前向神经网络
net=newff(minmax(P),[3,1],{'tansig','purelin'},'traingdm');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
% 当前输入层权值和阈值
inputWeights=net.IW{1,1}
inputWeights = 3×2
-0.969064876452355 -0.025869755102342 0.817668231449372 0.326091115093844 0.763570995392932 -0.373831165410649
inputbias=net.b{1}
inputbias = 3×1
2.935273323924948 -0.734925230818531 2.416916798310611
% 当前网络层权值和阈值
layerWeights=net.LW{2,1}
layerWeights = 1×3
-0.156477434747450 0.831471050378134 0.584414659119109
layerbias=net.b{2}
layerbias =
0.918984852785806
% 设置训练参数
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.mc = 0.9;
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
% 调用traingdm算法训练 BP 网络
[net,tr]=train(net,P,T);
% 对 BP 网络进行仿真
A = sim(net,P)
A = 1×4
-0.967280322299628 -1.014573198518491 0.966198779349029 1.038461801871997
% 计算仿真误差
E = T - A
E = 1×4
-0.032719677700372 0.014573198518491 0.033801220650971 -0.038461801871997
MSE=mse(E)
MSE =
9.761970361529907e-04
echo off
曲线拟合案例:
完成的拟合
隐藏层节点数为15的单输入,单输出的两层BP网络。
clear all;
P=-1:0.1:0.9;
T=[-0.832 -0.423 00.024 0.344 1.282 3.456 4.02 3.232 2.102 1.504...
0.248 1.242 2.344 3.262 2.052 1.684 1.022 2.224 3.022 1.984];
net=newff([-1 1],[15 1],{'tansig' 'purelin'},'traingdx','learngdm');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
net.trainParam.epochs=2500;
net.trainParam.goal=0.001;
net.trainParam.show=10;
net.trainParam.lr=0.05;
net=train(net,P,T);
当训练次数为365,其训练误差为0.000991<0.001,满足要求。
下面用训练好的网络仿真:
P=-1:0.1:0.9;
T=[-0.832 -0.423 00.024 0.344 1.282 3.456 4.02 3.232 2.102 1.504...
0.248 1.242 2.344 3.262 2.052 1.684 1.022 2.224 3.022 1.984];
hold on
plot(P,T,'r+');
p=-1:0.01:0.9;
R=sim(net,p);
plot(p,R);
hold off
案例:配送中心选址
将专家评价结果作为期望的网络输出。
clear all;
P=[1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00;
0.80 0.87 0.89 0.82 0.78 0.80 0.75 0.33;
0.67 0.93 0.22 0.75 1.00 0.80 0.49 0.66;
0.92 0.80 0.89 0.92 0.89 0.80 1.00 1.00;
0.87 0.93 1.00 1.00 1.00 1.00 1.00 1.00;
0.80 0.72 0.89 0.82 0.89 0.80 0.75 1.00;
0.67 0.72 0.67 0.66 0.67 0.60 0.49 0.66;
0.72 0.80 0.78 0.75 0.78 0.80 0.75 0.66;
0.60 0.60 0.56 0.58 0.56 0.60 0.49 0.66;
0.47 0.47 0.44 0.41 0.44 0.40 0.49 0.35]';
T=[1.00 0.79 0.74 0.81 0.96 0.83 0.69 0.75 0.58 0.51];
%根据Kolmogorov定理,由于输入层有8个结点,所以中间层有17个结点
%中间层神经元的传递函数为tansig
%输出层有1个结点,其神经元传递函数为logsig
%训练函数采用trainlm
net=newff(minmax(P),[17,1],{'tansig','logsig'},'trainlm');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
%训练步数为1000次
%训练目标误差为0.001
net.trainParam.epochs=1000;
net.trainParam.goal=0.001;
net=train(net,P,T);
Y=sim(net,P);
P_test=[0.40 0.40 0.33 0.33 0.33 0.40 0.49 0.35;
0.08 0.93 0.56 0.92 0.89 0.60 0.24 0.33;
0.67 0.60 0.89 0.82 1.00 0.80 0.75 0.29;
0.32 0.40 0.67 0.33 0.33 0.80 0.75 0.35;
0.87 0.72 0.89 0.92 0.89 0.40 0.49 0.29]';
Y=sim(net,P_test)
Y = 1×5
0.480201222740837 0.604436747430390 0.631079695468598 0.400755391943065 0.510572282541783
Y= 0.480201222740837 0.604436747430390 0.631079695468598 0.400755391943065 0.510572282541783
可见预测结果:方案13最优,15最差。
数据归一化处理
clear all;
%使用格式化,使矩阵x1的每一行的最低和最高值映射到默认区间[-1,+1]。
x1 = [1 2 4; 1 1 1; 3 2 2; 0 0 0];
[y1,PS] = mapminmax(x1)
y1 = 4×3
-1.000000000000000 -0.333333333333333 1.000000000000000 1.000000000000000 1.000000000000000 1.000000000000000 1.000000000000000 -1.000000000000000 -1.000000000000000 0 0 0
PS = 包含以下字段的 struct:
name: 'mapminmax' xrows: 4 xmax: [4×1 double] xmin: [4×1 double] xrange: [4×1 double] yrows: 4 ymax: 1 ymin: -1 yrange: 2 gain: [4×1 double] xoffset: [4×1 double] no_change: 0
%应用相同的处理设置新值
x2 = [5 2 3; 1 1 1; 6 7 3; 0 0 0];
y2 = mapminmax('apply',x2,PS)
y2 = 4×3
1.666666666666667 -0.333333333333333 0.333333333333333 1.000000000000000 1.000000000000000 1.000000000000000 7.000000000000000 9.000000000000000 1.000000000000000 0 0 0
%利用反归一化再次得到X1,Y1处理。
x1_again = mapminmax('reverse',y1,PS)
x1_again = 4×3
1 2 4 1 1 1 3 2 2 0 0 0
模拟正弦函数
clear all
% 定义训练样本矢量
P = [-1:0.05:1]; % P 为输入矢量
randn('seed',78341223); % T 为目标矢量
T = sin(2*pi*P)+0.1*randn(size(P));
% 绘制训练样本数据点
plot(P,T,'+');
title('训练样本点');
hold on;
plot(P,sin(2*pi*P),':'); % 绘制不含噪声的正弦曲线
title('不含噪声的正弦曲线 ');
% 定义验证样本
val.P = [-0.975:0.05:0.975]; % 验证样本的输入矢量
val.T = sin(2*pi*val.P)+0.1*randn(size(val.P)); % 验证样本的目标矢量
% 创建一个新的前向神经网络
net=newff(minmax(P),[5,1],{'tansig','purelin'},'traingdx');
警告: NEWFF used in an obsolete way.
See help for NEWFF to update calls to the new argument list.
% 设置训练参数
net.trainParam.epochs = 500;
net = init(net);
% 训练 BP 网络
[net,tr]=train(net,P,T,[],[],val);
% 对 BP 网络进行仿真
A = sim(net,P);
% 计算仿真误差
E = T - A;
MSE=mse(E)
MSE =
0.009629663473851
% 绘制仿真拟合结果曲线
plot(P,A,P,T,'+',P,sin(2*pi*P),':');
title('仿真拟合曲线')
参考文献
  1. Matlab数据分析教程,由伟等,清华大学出版社,2020年1月
  2. 神经·模糊·预测控制及其MATLAB实现(第4版),李国勇,杨丽娟电子工业出版社,2018-10-01(案例中的代码有点旧)
  3. MATLAB R2016a神经网络设计应用27例,顾艳春,电子工业出版社,2018年1月